#coding:utf-8

import os
from google.appengine.ext import webapp
from google.appengine.ext.webapp.util import run_wsgi_app
from google.appengine.ext.webapp import template
import re
import types
import urllib2
from google.appengine.api import urlfetch

class MainPage(webapp.RequestHandler):

    def __init__(self):
        #传递参数
        self.template_values={
            'function':'match',
            'replace':False,
            'ignore_case':False,
            'Multi_line':False,
            'Single_line':False,
            'Verbose':False,
            'Unicode':False,
            'Locale':False,
            'ReExpression':r'\b(?P<name>\w+)\b\s+(?P=name)',
            'SearchText':'本开源项目:http://code.google.com/p/pyretoolkit/\n博客:booolee.cnblogs.com\n信箱:booolee@gmail.com\nQQ:25737305',
            'Replacement':r'file:\1, line:\2, code:"\3"',
            'ReplaceText':'smaple',
            'Results':'',
            'MaxSplit':0,
            'Url':r'http://booolee.cnblogs.com/',
            'Count':0,
            'GetWeb':False,
            'Coding':'utf8',
            'GroupIDs':[],
            'GroupNames':[],
            'GroupsCount':0,
            }   
    
    def get(self):       
        path=os.path.join(os.path.dirname(__file__),'ui_template.html')
        self.response.out.write(template.render(path,self.template_values))
        
    def post(self):
        #功能标志
        self.template_values['function']=self.request.get('function')

        if self.request.get('function')=='replace' or self.request.get('function')=='replaceall':
            self.template_values['replace']=True

        if self.request.get('option_I')=='True':
            self.template_values['ignore_case']=True
        else:
            self.template_values['ignore_case']=False

        if self.request.get('option_M')=='True':
            self.template_values['Multi_line']=True
        else:
            self.template_values['Multi_line']=False

        if self.request.get('option_S')=='True':
            self.template_values['Single_line']=True
        else:
            self.template_values['Single_line']=False

        if self.request.get('option_V')=='True':
            self.template_values['Verbose']=True
        else:
            self.template_values['Verbose']=False

        if self.request.get('option_U')=='True':
            self.template_values['Unicode']=True
        else:
            self.template_values['Unicode']=False

        if self.request.get('option_L')=='True':
            self.template_values['Locale']=True
        else:
            self.template_values['Locale']=False

        if self.request.get('check_getweb')=='True':
            self.template_values['GetWeb']=True
        else:
            self.template_values['GetWeb']=False

        self.template_values['ReExpression']=self.request.get('text_regular_expression')
        self.template_values['SearchText']=self.request.get('text_searchtext')
        self.template_values['Replacement']=self.request.get('text_replacement')
        self.template_values['ReplaceText']=self.request.get('text_replacedtext')
        self.template_values['Results']=self.request.get('text_results')
        self.template_values['MaxSplit']=self.request.get('textbox_maxsplit')
        self.template_values['Url']=self.request.get('textbox_url')
        self.template_values['Count']=self.request.get('textbox_count')
        self.template_values['Coding']=self.request.get('textbox_coding')

        #self.getweb()
        self.getweb_by_google()
        self.re_test()
        
        #渲染
        path=os.path.join(os.path.dirname(__file__),'ui_template.html')        
        self.response.out.write(template.render(path,self.template_values))

    #根据配置测试正则表达式
    def re_test(self):
        
        flage=0
        
        if self.template_values['ignore_case']:
            flage=flage | re.I
        
        if self.template_values['Multi_line']:
            flage=flage | re.M

        if self.template_values['Single_line']:
            flage=flage | re.S

        if self.template_values['Verbose']:
            flage=flage | re.X

        if self.template_values['Unicode']:
            flage=flage | re.U

        if self.template_values['Locale']:
            flage=flage | re.L

        if flage:
            p=re.compile(self.template_values['ReExpression'],flage)
        else:
            p=re.compile(self.template_values['ReExpression'])

        self.template_values['Results']=''

        #match
        if self.template_values['function']=='match':
            m=p.search(self.template_values['SearchText'])
            if m:
                i=1
                self.template_values['Results']+='Match 0(Group 0) ' + str(m.span(0)) + ' ' + m.group(0) + '\n'
                for match in m.groups():
                    self.template_values['Results']+='...(Group ' + str(i) +') ' + str(m.span(i)) + ' ' + match + '\n'
                    i+=1
            else:
                self.template_values['Results']='没有匹配'

        #match all
        if self.template_values['function']=='matchall':
            iterator =p.finditer(self.template_values['SearchText'])            
            if iterator :
                j=0
                for match in iterator :
                    self.template_values['Results']+= 'Match ' + str(j) + ' (Group 0) ' + str(match.span(0)) + ' ' + match.group(0) + '\n'
                    i=1
                    for m in match.groups():
                        self.template_values['Results']+='...(Group ' + str(i) +') ' + str(match.span(i)) + ' ' + m + '\n'
                        i+=1
                    j+=1
            else:
                self.template_values['Results']='没有匹配'

        #split
        if self.template_values['function']=='split':
            try:
                MaxSplit=int(self.template_values['MaxSplit'])
            except:
                MaxSplit=0
                
            splitlist=p.split(self.template_values['SearchText'],MaxSplit)
            self.template_values['Results']+='Max Split: ' + str(MaxSplit) + '\n'
                
            for listitem in splitlist:
                self.template_values['Results']+=listitem + '\n'

        #replace
        if self.template_values['function']=='replace':
            try:
                Count=int(self.template_values['Count'])
            except:
                Count=0

            self.template_values['ReplaceText']=str(Count)
            self.template_values['ReplaceText']=p.sub(self.template_values['Replacement'],self.template_values['SearchText'],Count)

            if Count>0 :
                self.template_values['Results']='替换最大次数: ' + str(Count)
            else:
                self.template_values['Results']='替换最大次数: 无限制'

        #replace all
        if self.template_values['function']=='replaceall':

            result=p.subn(self.template_values['Replacement'],self.template_values['SearchText'])
            self.template_values['ReplaceText']=result[0]

            self.template_values['Results']='替换次数: ' + str(result[1])

        #replace模式下获取组列表
        if self.template_values['replace']:            
            #分析所有组
            r=self.template_values['ReExpression']
            s=re.subn(r'\[(?![?]).*?\]','',r)
            s=re.subn(r'\\\(','',s[0])
            s=re.subn(r'\?P<','',s[0])
            l=re.findall(r'\((?!\?).*?\)',s[0])
            self.template_values['GroupsCount']=len(l)
            count=len(l)+1
            for  i in range(1,count):
                self.template_values['GroupIDs'].append(i)

            #分析命名组
            l=re.findall(r'(?<=\(\?P<).+?(?=>)',r)
            for groupname in l:
                self.template_values['GroupNames'].append(groupname)
            

    #从指定网址抓取内容
    def getweb(self):
        if self.template_values['GetWeb']:
            try:                
                self.template_values['SearchText']=urllib2.urlopen(self.template_values['Url']).read()
                
            except:
                self.template_values['SearchText']='抓取内容失败'

    #google提供的抓取网页功能
    def getweb_by_google(self):
        if self.template_values['GetWeb']:
            try:                
                result=urlfetch.fetch(self.template_values['Url'])
                if result.status_code==200:
                    #获取网页编码
                    m=re.search(r'(?<=charset=).+(?=")',result.content)
                    
                    if m:
                        self.template_values['Coding']=m.group()
                        #根据网页编码对网页进行解码
                        self.template_values['SearchText']=result.content.decode(self.template_values['Coding'])
                    else:
                        self.template_values['Coding']='未知'
                        self.template_values['SearchText']=result.content 

            except:
                self.template_values['SearchText']='抓取内容失败'
        
application=webapp.WSGIApplication(
    [('/',MainPage)],
    debug=True)

def main():
    run_wsgi_app(application)

if __name__=="__main__":
    main()
